package com.ljdy.product.controller;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.ljdy.product.exception.NotIsPictureException;
import com.ljdy.product.po.Product;
import com.ljdy.product.service.IProductService;
import com.ljdy.product.utils.CheckFileType;

@Controller
@RequestMapping("/product")
public class ProductController {

	@Autowired
	public IProductService productServcie;
	
	@RequestMapping("/findAll")
	public String findAll(Model model){
		
		List<Product> products = productServcie.findAll();
		
		model.addAttribute("productList", products);
		return "product";
	}
	
	@RequestMapping(value="/save",method=RequestMethod.POST)
	public String save(Product product,@RequestParam("file") MultipartFile file) throws Exception{
		System.out.println(file.getOriginalFilename());
		//判断是否是图片
		if(CheckFileType.checkPicture(file.getOriginalFilename())) {
			//存储文件
			Map<String, String> map = uploadPicture(file);
			//上传图片成功
			if (map.get("success").equals("true")) {
				//保存图片地址
				product.setPic(map.get("url"));
			}
		}else {
			//全局异常处理---------不是图片异常
			throw new NotIsPictureException(100,"请上传正确的图片格式文件");
		}
		productServcie.save(product);
		return "redirect:findAll";
	}
	
	@RequestMapping(value="/delete")
	public void delete(Integer id){
		productServcie.delete(id);
	}
	
	//fdfs客户端配置文件路径
	@Value("${fdfs.client.conf.path}")
	private String fdfs_client_conf_path;
	
	//服务端nginx地址
	@Value("${fdfs.nginx.path}")
	private String fdfs_nginx_path;
	
	//文件上传
	private Map<String,String> uploadPicture(MultipartFile file) throws Exception {
		//上传到fastDFS
		Map<String, String> map = new HashMap<String, String>();
		//图片存放地址
		String substring = "";
		//文件是否为空
		if (!file.isEmpty()) {      
            try {      
                /*    
                 * 这段代码执行完毕之后，图片上传到了工程的跟路径； 大家自己扩散下思维，如果我们想把图片上传到    
                 * d:/files大家是否能实现呢？ 等等;    
                 * 这里只是简单一个例子,请自行参考，融入到实际中可能需要大家自己做一些思考，比如： 1、文件路径； 2、文件名；    
                 * 3、文件格式; 4、文件大小的限制;    
                 */     
            	
            	/*
            	 *********************************************************
            	 *上传fastdfs服务器
            	 ********************************************************* 
            	 */
            	System.out.println("上传图片中...");
                // 1、加载配置文件，配置文件中的内容就是 tracker 服务的地址。
                ClientGlobal.init(fdfs_client_conf_path);
                // 2、创建一个 TrackerClient 对象。直接 new 一个。
                TrackerClient trackerClient = new TrackerClient();
                // 3、使用 TrackerClient 对象创建连接，获得一个 TrackerServer 对象。
                TrackerServer trackerServer = trackerClient.getConnection();
                // 4、创建一个 StorageServer 的引用，值为 null
                StorageServer storageServer = null;
                // 5、 创建一个 StorageClient 对象， 需要两个参数 TrackerServer 对象、 StorageServer 的引用
                StorageClient storageClient = new StorageClient(trackerServer, storageServer);
                // 6、使用 StorageClient 对象上传图片。
                //扩展名不带“.”
                //文件名
                String filename = file.getOriginalFilename();
                //后缀
                String suffix = filename.substring(filename.lastIndexOf(".")+1);
                String[] strings = storageClient.upload_file(file.getBytes(), suffix,
                null);
                // 7、返回数组。包含组名和图片的路径。
                String path = fdfs_nginx_path;
                for (String string : strings) {
                    path+=string+"/";
                }
                substring = path.substring(0, path.lastIndexOf("/"));
                System.out.println(substring);
            	
            } catch (IOException e) {      
                e.printStackTrace();      
                map.put("success", "false");      
                map.put("msg", "上传失败," + e.getMessage());      
                return map;      
            } 
            
            map.put("success", "true");      
            map.put("msg", "上传成功");      
            map.put("url", substring );      
            return map;      
      
        } else {      
        	map.put("success", "false");      
        	map.put("msg", "上传失败，因为文件是空的.");      
        	return map;      
        }
	}
	
	
}
